/**
 * Line.pde. 
 * by Leonardo Ariel Cortes Mendoza.
 * 
 * Implementacion del algoritmo de Bresenham para dibujar una linea
 * los puntos en lugar de ser dibujados en pantalla son pintados usando
 * el metodo drawPoint() de la libreria Malla, tambien se puede ver como el fondo,
 * el color de las celdas de la malla pueden ser ajustados
 * 
*/

import remixlab.malla.*;

MyMalla malla;
int x0, y0;
int mx0, my0, mx1, my1;

void setup() {
  size(640, 480, P2D);
  frameRate(30);
  smooth();
  malla = new MyMalla(this);
  malla.init();
  background(255);
  noFill();
}

void draw() {
  noFill();
  malla.drawMalla();
  if(mousePressed){
    line(x0, y0, mouseX, mouseY);
    //bresenham(mx0, my0, malla.whereIsX(mouseX), malla.whereIsY(mouseY));
  }
  stroke(206);
}

void mousePressed(){
  malla.cleanMalla();
  x0 = mouseX;
  y0 = mouseY;
  mx0 = malla.whereIsX(mouseX);
  my0 = malla.whereIsY(mouseY);
}

void mouseDragged(){
  stroke(0);
  line(x0, y0, mouseX, mouseY);
  stroke(206);
}

void mouseReleased(){
  mx1 = malla.whereIsX(mouseX);
  my1 = malla.whereIsY(mouseY);
  bresenham(mx0, my0, mx1, my1);
}

class MyMalla extends Malla {
  
  public MyMalla(PApplet p) {
    super(p);
  }
  
  public void init() {
    setMidPoints(false);
    setStrokeWeight(1);
    setNumOfColumn(40);
    setCellColor(color(0,255,0));
    setStrokeColor(color(255,255,0));
    setBackgroundColor(color(0,255,255));
    initialize();
  }
}

void bresenham(int x0, int y0, int x1, int y1) {
  int dy = y1 - y0;
  int dx = x1 - x0;
  int stepx, stepy;

  if(dy < 0){
    dy = -dy; 
    stepy = -1;
  } 
  else { 
    stepy = 1; 
  }
  if(dx < 0){
    dx = -dx; 
    stepx = -1;
  } 
  else { 
    stepx = 1; 
  }
  dy = 2 * dy; 
  dx = 2 * dx; 

  malla.drawPoint(x0,y0);

  if(dx > dy){
    int fraction = dy - (dx >> 1);
    while(x0 != x1) {
      if(fraction >= 0) {
        y0 += stepy;
        fraction -= dx;
      }
      x0 += stepx;
      fraction += dy;
      malla.drawPoint(x0,y0);
    }
  } 
  else {
    int fraction = dx - (dy >> 1);
    while(y0 != y1){
      if(fraction >= 0){
        x0 += stepx;
        fraction -= dy;
      }
      y0 += stepy;
      fraction += dx;
      malla.drawPoint(x0,y0);
    }
  }
}
